了解下C语言编译,词法分析中的“贪心法则”,有助于避免许多不必要的书写错误。
贪心法则
对于本题 a---b 如何拆解成合法符号的问题,C语言有一个简单的规则,“贪心法则”:每一个符号应该包含尽可能多的字符。
也就是说,编译器将源代码,从左到右,一个字符一个字符地读入,如果加入下一个字符依旧可以构成一个合法符号,则包含该字符,直到不可以为止。
- 和 -- 都是合法运算符,但 --- 不是
例题分析
(1) a---b 的意思是什么?
首先,a是一个合法符号,a-不是,所以第1个符号是a
其次,-是一个合法符号,--也是一个合法符号,但---不是,所以第2个符号是--
然后,-是一个合法符号,-b不是一个合法符号,所以第2个符号是-
最后,只剩下一个字符b,它是一个合法的符号
所以,a---b,依据贪心法则,得出的结果是:a -- - b ,也就是 (a--) - b
(备注:合法的符号,如变量名,只能有大小写字母、数字和_下划线组成,并且不能是数字开头这里的a和b都是变量名。)
int a =11; int b =4; cout<a---b<endl;//7 cout<a<endl;//10
(2) y = x/*p是什么意思呢?
如(1)的分析步骤,前2个符号依次是y , =,本题重点,在x/*p上,依旧贪心法则:
首先, x是一个合法符号, x/则不是;
其次,/是一个合法符号,/*也是一个合法符号,但/*p不是一个合法符号,所以第2个符号是/*, 看到/*后,编译器将把它后续字符均当做是注释扔掉,直到看到*/为止。-_-||
此题的本意是 y = x / (*p),但因为忽略了规则,此书写错误或直接导致编译错误。
本页共26段,888个字符,1939 Byte(字节)